package com.hospital.common.base.interfaces;

import com.hospital.common.annotations.EnableDiscussAuth;
import com.hospital.common.base.ThreadAttributes;
import com.hospital.common.enums.DiscussRoleType;
import com.hospital.common.utils.ThreadLocalUtils;
import org.aspectj.lang.JoinPoint;
import org.springframework.util.ObjectUtils;

/**
 * 抽象权限控制类(针对实际服务中的AOP)
 * <br>
 * 使用方法: 实现接口,直接调用auth方法
 * @author yhn
 * @version 1.0
 */
public interface DiscussAuth {
    /**
     * 权限校验
     * <br>
     * 适用于环绕通知,ProceedingJoinPoint继承JoinPoint
     * @param jp AOP参数
     * @return 是否通过校验
     */
    default Boolean auth(JoinPoint jp) {
        // 获取访问的方法上的EnableAuth注解
        EnableDiscussAuth enableDiscussAuth = jp.getTarget().getClass().getAnnotation(EnableDiscussAuth.class);
        if(ObjectUtils.isEmpty(enableDiscussAuth)){
            return true;
        }
        // 获取线程变量中的用户信息
        ThreadAttributes threadAttributes = ThreadLocalUtils.get();
        if(ObjectUtils.isEmpty(threadAttributes)){
            return false;
        }
        // 遍历比较是否存在访问权限
        for(DiscussRoleType roleType : enableDiscussAuth.value()){
            if(threadAttributes.getRoleType().equals(roleType.value)){
                return true;
            }
        }
        return false;
    }
}
